/*
*   
*    结绳封装： 阿杰 Meng
*    有问题请联系： q2217444740
*    
*    库： [OkHttps]  ejlchina  troyzhxu
*	Github: https://github.com/ejlchina/okhttps
*	Gitee: https://gitee.com/troyzhxu/okhttps
*
*/

@附加权限(安卓权限.网络权限)
@附加权限(安卓权限.文件权限_读取)
@外部依赖库("../依赖库")
@导入Java("cn.zhxu.okhttps.*")
@导入Java("okhttp3.*")
@导入Java("java.util.concurrent.TimeUnit")
类 OkHttps全局
	@code
	static HTTP http;
	static HTTP.Builder builder;
	static com.lzy.okgo.cookie.CookieJarImpl ck;
	
	public #<OkHttps全局>(){}
	public static HTTP getHttp(){
		if (http != null) {
            return http;
        }
        synchronized (#<OkHttps全局>.class) {
            if (http == null) {
                http = OkHttps.getHttp();
            }
            return http;
       }
	}
	public HTTP.Builder getBuilder(){
		if (builder != null) {
            return builder;
        }
        synchronized (#<OkHttps全局>.class) {
            if (builder == null) {
                builder = getHttp().newBuilder();
            }
            return builder;
       }
	}
	public void initConfig(){
		http = getBuilder().build();
	}
	@end

	方法 全局URL前缀(Url : 文本)
		code getBuilder().baseUrl(#Url);
		code initConfig();
	结束 方法

	方法 默认编码(编码 : Oks编码)
		code getBuilder().charset(#编码);
		code initConfig();
	结束 方法

	方法 默认请求类型(类型 : 文本)
		code getBuilder().bodyType(#类型);
		code initConfig();
	结束 方法

	方法 连接超时时间(时长_秒 : 整数) : OkHttps全局
		code getBuilder().config((OkHttpClient.Builder builder) -> {builder.connectTimeout(#时长_秒, TimeUnit.SECONDS);});
		code initConfig();
		返回 本对象
	结束 方法

	方法 写入超时时间(时长_秒 : 整数) : OkHttps全局
		code getBuilder().config((OkHttpClient.Builder builder) -> {builder.writeTimeout(#时长_秒, TimeUnit.SECONDS);});
		code initConfig();
		返回 本对象
	结束 方法

	方法 读取超时时间(时长_秒 : 整数) : OkHttps全局
		code getBuilder().config((OkHttpClient.Builder builder) -> {builder.readTimeout(#时长_秒, TimeUnit.SECONDS);});
		code initConfig();
		返回 本对象
	结束 方法

	方法 自动重试次数(次数 : 整数)
		@code
		getBuilder().config(b -> {
        b.addInterceptor(chain -> {
            int retryTimes = 0;	
            while (true) {
                try {
                    return chain.proceed(chain.request());
                } catch (Exception e) {
                    if (retryTimes >= #次数) {
                        throw e;
                    }
                    retryTimes++;
                }
            }
        });
		});
		initConfig();
		@end
	结束 方法

	//配置连接池 单位：分钟（不配置默认为 5）
	方法 连接池(最大空闲连接 : 整数, 存活时间 : 整数)
		@code
		getBuilder().config((OkHttpClient.Builder builder) -> {
        	builder.connectionPool(new ConnectionPool(#最大空闲连接, #存活时间, TimeUnit.MINUTES));
    	});
		initConfig();
		@end
	结束 方法

	方法 禁止重定向(是否 : 逻辑型)
		@code
		getBuilder().config((OkHttpClient.Builder builder) -> {
        	builder.followRedirects(!#是否);
    	});
		initConfig();
		@end
	结束 方法

	@废弃使用("方法更名为 自动保存Cookie()")
	方法 持久化Cookie()
		自动保存Cookie()
	结束 方法

	方法 自动保存Cookie()
		@code
		getBuilder().config(b -> {b.cookieJar(ck == null ? ck = new com.lzy.okgo.cookie.CookieJarImpl(new com.lzy.okgo.cookie.store.SPCookieStore()):ck);});
		initConfig();
		@end
	结束 方法

	@废弃使用("“应用配置” 此方法已被废弃，因部分使用者 不调用此方法导致配置不生效，因此改为 每次修改都自动应用")
	方法 应用配置()
		code initConfig();
	结束 方法

	方法 重置配置()
		@code
		http = OkHttps.getHttp();
		builder = http.newBuilder();
		@end
	结束 方法

	方法 取Cookie管理器() : OksCookie管理器
		code return (ck == null ? ck = new com.lzy.okgo.cookie.CookieJarImpl(new com.lzy.okgo.cookie.store.SPCookieStore()):ck).getCookieStore();
	结束 方法

结束 类

@导入Java("cn.zhxu.okhttps.*")
类 OkHttps : OkHttps全局

	@code
	HTTP http;
	HTTP.Builder builder;
	
	public #<OkHttps>(){
		http = #<OkHttps全局>.getHttp();
	}
	public HTTP.Builder getBuilder(){
        if (builder == null) builder = getHttp().newBuilder();
        return builder;
	}
	@end

	方法 创建异步请求(链接 : 文本 = "null") : Oks异步
		code return new #<Oks异步>(#链接, getBuilder().build());
	结束 方法

	方法 创建同步请求(链接 : 文本 = "null") : Oks同步
		code return new #<Oks同步>(#链接, getBuilder().build());
	结束 方法

	方法 创建Websockt(链接 : 文本 = "null") : OksWS
		code return new #<OksWS>(#链接, getBuilder().build());
	结束 方法

	@静态
	方法 异步请求(链接 : 文本) : Oks异步
		code return new #<Oks异步>(#链接);
	结束 方法

	@静态
	方法 同步请求(链接 : 文本) : Oks同步
		code return new #<Oks同步>(#链接);
	结束 方法

	@静态
	方法 Websockt(链接 : 文本) : OksWS
		code return new #<OksWS>(#链接);
	结束 方法

	@静态
	方法 取消请求(标签 : 文本)
		code OkHttps.cancel(#标签);
	结束 方法

	@静态
	方法 取消全部请求()
		code #<OkHttps全局>.getHttp().cancelAll();
	结束 方法

结束 类

@导入Java("cn.zhxu.okhttps.*")
类 Oks异步

	@code
	AHttpTask ht;
	HttpCall hc;
	android.os.Handler hr;
	boolean maint = false;
	boolean cbody = false;
	public boolean getMainT(){return maint;}
	public boolean getCB(){return cbody;}
	public #<Oks异步>(){
		this("null",null);
	}
	public #<Oks异步>(String url){
		this(url,null);
	}
	public #<Oks异步>(String url, HTTP http){
		ht = http == null ? #<OkHttps全局>.getHttp().async(url) : http.async(url);
		ht.setOnException((java.io.IOException s) -> {
			if(getMainT()){
		    	(hr != null ? hr : (hr = new android.os.Handler(android.os.Looper.getMainLooper())))
				.post(new Runnable() {  
              	  @Override
                	public void run() {
						#请求异常(s);
					}
				});
				return;
			}
			android.os.Looper.prepare();
			#请求异常(s);
			android.os.Looper.loop();
		})
		.setOnComplete((#<@Oks状态> s) -> {
			if(getMainT()){
				(hr != null ? hr : (hr = new android.os.Handler(android.os.Looper.getMainLooper())))
				.post(new Runnable() {  
              	  @Override
                	public void run() {
						#请求完成(s);
					}
				});
				return;
			}
			android.os.Looper.prepare();
			#请求完成(s);
			android.os.Looper.loop();
		})
		.setOnResponse((HttpResult s) -> {
			if(getCB()) try{s.getBody().cache().toByteStream().close();}catch(#<@异常> e){}
			if(getMainT()){
				(hr != null ? hr : (hr = new android.os.Handler(android.os.Looper.getMainLooper())))
				.post(new Runnable() {  
              	  @Override
                	public void run() {
						#请求成功(new #<Oks结果>(s));
					}
				});
				return;
			}
			android.os.Looper.prepare();
			#请求成功(new #<Oks结果>(s));
			android.os.Looper.loop();
		})
		.setOnProcess((#<@Oks进度> p) -> {
			if(getMainT()){
				(hr != null ? hr : (hr = new android.os.Handler(android.os.Looper.getMainLooper())))
				.post(new Runnable() {  
              	  @Override
                	public void run() {
						#上传进度(p);
					}
				});
				return;
			}
			android.os.Looper.prepare();
			#上传进度(p);
			android.os.Looper.loop();
        });
	}
	@end

	方法 请求链接(链接 : 文本)
		code ht.setUrl(#链接, false);
	结束 方法

	方法 添请求头(键 : 文本, 值 : 文本)
		code ht.addHeader(#键, #值);
	结束 方法

	方法 置请求头(请求头 : 文本到文本哈希表)
		清空请求头()
		code ht.addHeader(#请求头);
	结束 方法

	方法 移除请求头(键 : 文本)
		code if(ht.getHeaders() != null) ht.getHeaders().remove(#键);
	结束 方法

	方法 清空请求头()
		code if(ht.getHeaders() != null) ht.getHeaders().clear();
	结束 方法

	// URL参数，会拼接到URL ? 后面
	方法 添查询参数(键 : 文本, 值 : 文本)
		code ht.addUrlPara(#键, #值);
	结束 方法

	// URL参数，会拼接到URL ? 后面
	方法 置查询参数(请求参数 : 文本到文本哈希表)
		清空查询参数()
		code ht.addUrlPara(#请求参数);
	结束 方法

	方法 移除查询参数(键 : 文本)
		code if(ht.getUrlParas() != null) ht.getUrlParas().remove(#键);
	结束 方法

	方法 清空查询参数()
		code if(ht.getUrlParas() != null) ht.getUrlParas().clear();
	结束 方法

	// URL路径参数，替换链接里的 {name}
	方法 添路径参数(键 : 文本, 值 : 文本)
		code ht.addPathPara(#键, #值);
	结束 方法

	// URL路径参数，替换链接里的 {name}
	方法 置路径参数(路径参数 : 文本到对象哈希表)
		清空路径参数()
		code ht.addPathPara(#路径参数);
	结束 方法

	方法 移除路径参数(键 : 文本)
		code if(ht.getPathParas() != null) ht.getPathParas().remove(#键);
	结束 方法

	方法 清空路径参数()
		code if(ht.getPathParas() != null) ht.getPathParas().clear();
	结束 方法

	方法 添请求参数(键 : 文本, 值 : 文本)
		code ht.addBodyPara(#键, #值);
	结束 方法

	方法 添请求参数2(报文参数 : 文本到对象哈希表)
		code ht.addBodyPara(#报文参数);
	结束 方法

	//支持 字节数组、字符串(如：JSON对象、键值对字符串)、输入流、哈希表
	方法 置请求参数(报文参数 : 对象)
		@code
		if(#报文参数 instanceof java.util.HashMap){
			#清空请求参数();
			ht.addBodyPara((java.util.HashMap)#报文参数);
		} else if(#报文参数 instanceof org.json.JSONObject){
			ht.setBodyPara(((org.json.JSONObject)#报文参数).toString());
		} else {ht.setBodyPara(#报文参数);}
		@end
	结束 方法

	方法 移除请求参数(键 : 文本)
		code if(ht.getBodyParas() != null) ht.getBodyParas().remove(#键);
	结束 方法

	方法 清空请求参数()
		code if(ht.getBodyParas() != null) ht.getBodyParas().clear();
	结束 方法

	@外部依赖库("../依赖库/JSON解析库")
	方法 请求类型(Content_Type : 文本)
		code ht.bodyType(#Content_Type);
	结束 方法

	方法 取请求类型() : 文本
		code return ht.getBodyType();
	结束 方法

	方法 添文件(键 : 文本, 文件路径 : 文本)
		code ht.addFilePara(#键, #文件路径);
	结束 方法

	方法 添文件2(键 : 文本, 文件 : 文件)
		code ht.addFilePara(#键, #文件);
	结束 方法

	方法 添文件3(键 : 文本, 文件类型 : 文本, 文件名 : 文本, 内容 : 字节[])
		code ht.addFilePara(#键, #文件类型, #文件名, #内容);
	结束 方法

	方法 移除文件(键 : 文本)
		code if(ht.getFileParas() != null) ht.getFileParas().remove(#键);
	结束 方法

	方法 清空文件()
		code if(ht.getFileParas() != null) ht.getFileParas().clear();
	结束 方法

	方法 添标签(标签 : 文本)
		code ht.tag(#标签);
	结束 方法

	方法 编码(编码 : Oks编码)
		code ht.charset(#编码);
	结束 方法

	方法 置Range(位置 : 长整数)
		code ht.setRange(#位置);
	结束 方法

	方法 置Range2(位置 : 长整数, 结束位置 : 长整数)
		code ht.setRange(#位置, #结束位置);
	结束 方法

	方法 绑定(对象 : 对象)
		code ht.bind(#对象);
	结束 方法

	方法 不抛异常()
		code ht.nothrow();
	结束 方法

	方法 回调主线程(是否 : 逻辑型)
		code hr = new android.os.Handler(android.os.Looper.getMainLooper());
		code maint = #是否;
	结束 方法

	方法 缓存报文(是否 : 逻辑型)
		code cbody = #是否;
	结束 方法

	方法 取消请求()
		code if(hc != null) hc.cancel();
	结束 方法

	方法 GET()
		code hc = ht.get();
	结束 方法

	方法 POST()
		code hc = ht.post();
	结束 方法

	方法 HEAD()
		code hc = ht.head();
	结束 方法

	方法 PUT()
		code hc = ht.put();
	结束 方法

	方法 PATCH()
		code hc = ht.patch();
	结束 方法

	方法 DELETE()
		code hc = ht.delete();
	结束 方法

	方法 CONNECT()
		code hc = ht.request("connect");
	结束 方法

	方法 OPTIONS()
		code hc = ht.request("options");
	结束 方法

	方法 TRACE()
		code hc = ht.request("trace");
	结束 方法

	方法 取消请求()
		code if(hc != null) hc.cancel();
	结束 方法

	方法 是否完成() : 逻辑型
		code return hc != null ? hc.isDone() : false;
	结束 方法

	方法 是否被取消() : 逻辑型
		code return hc != null ? hc.isCanceled() : false;
	结束 方法

	方法 取结果() : Oks结果
		code return new #<Oks结果>(hc != null ? hc.getResult() : ht.get().getResult());
	结束 方法

	定义事件 请求异常(异常 : 异常)

	定义事件 请求完成(状态 : Oks状态)

	定义事件 请求成功(结果 : Oks结果)

	定义事件 上传进度(进度 : Oks进度)

结束 类

@导入Java("cn.zhxu.okhttps.*")
类 Oks同步

	@code
	SHttpTask ht;
	android.os.Handler hr;
	boolean maint = false;
	public boolean getMainT(){return maint;}
	public #<Oks同步>(){
		this("null",null);
	}
	public #<Oks同步>(String url){
		this(url,null);
	}
	public #<Oks同步>(String url, HTTP http){
		ht = http == null ? #<OkHttps全局>.getHttp().sync(url) : http.sync(url);
		ht.setOnProcess((#<@Oks进度> p) -> {
			if(getMainT()){
				(hr != null ? hr : (hr = new android.os.Handler(android.os.Looper.getMainLooper())))
				.post(new Runnable() {  
              	  @Override
                	public void run() {
						#上传进度(p);
					}
				});
				return;
			}
			android.os.Looper.prepare();
			#上传进度(p);
			android.os.Looper.loop();
        });
	}
	@end

	方法 请求链接(链接 : 文本)
		code ht.setUrl(#链接, false);
	结束 方法

	方法 添请求头(键 : 文本, 值 : 文本)
		code ht.addHeader(#键, #值);
	结束 方法

	方法 置请求头(请求头 : 文本到文本哈希表)
		清空请求头()
		code ht.addHeader(#请求头);
	结束 方法

	方法 移除请求头(键 : 文本)
		code if(ht.getHeaders() != null) ht.getHeaders().remove(#键);
	结束 方法

	方法 清空请求头()
		code if(ht.getHeaders() != null) ht.getHeaders().clear();
	结束 方法

	// URL参数，会拼接到URL ? 后面
	方法 添查询参数(键 : 文本, 值 : 文本)
		code ht.addUrlPara(#键, #值);
	结束 方法

	// URL参数，会拼接到URL ? 后面
	方法 置查询参数(请求参数 : 文本到文本哈希表)
		清空查询参数()
		code ht.addUrlPara(#请求参数);
	结束 方法

	方法 移除查询参数(键 : 文本)
		code if(ht.getUrlParas() != null) ht.getUrlParas().remove(#键);
	结束 方法

	方法 清空查询参数()
		code if(ht.getUrlParas() != null) ht.getUrlParas().clear();
	结束 方法

	// URL路径参数，替换链接里的 {name}
	方法 添路径参数(键 : 文本, 值 : 文本)
		code ht.addPathPara(#键, #值);
	结束 方法

	// URL路径参数，替换链接里的 {name}
	方法 置路径参数(路径参数 : 文本到对象哈希表)
		清空路径参数()
		code ht.addPathPara(#路径参数);
	结束 方法

	方法 移除路径参数(键 : 文本)
		code if(ht.getPathParas() != null) ht.getPathParas().remove(#键);
	结束 方法

	方法 清空路径参数()
		code if(ht.getPathParas() != null) ht.getPathParas().clear();
	结束 方法

	方法 添请求参数(键 : 文本, 值 : 文本)
		code if(ht.getPathParas() != null) ht.addBodyPara(#键, #值);
	结束 方法

	方法 添请求参数2(报文参数 : 文本到对象哈希表)
		code ht.addBodyPara(#报文参数);
	结束 方法

	//支持 字节数组、字符串(如：JSON对象、键值对字符串)、输入流、哈希表
	方法 置请求参数(报文参数 : 对象)
		@code
		if(#报文参数 instanceof java.util.HashMap){
			#清空请求参数();
			ht.addBodyPara((java.util.HashMap)#报文参数);
		} else if(#报文参数 instanceof org.json.JSONObject){
			ht.setBodyPara(((org.json.JSONObject)#报文参数).toString());
		} else {ht.setBodyPara(#报文参数);}
		@end
	结束 方法

	方法 移除请求参数(键 : 文本)
		code if(ht.getBodyParas() != null) ht.getBodyParas().remove(#键);
	结束 方法

	方法 清空请求参数()
		code if(ht.getBodyParas() != null) ht.getBodyParas().clear();
	结束 方法

	@外部依赖库("../依赖库/JSON解析库")
	方法 请求类型(Content_Type : 文本)
		code ht.bodyType(#Content_Type);
	结束 方法

	方法 添文件(键 : 文本, 文件路径 : 文本)
		code ht.addFilePara(#键, #文件路径);
	结束 方法

	方法 添文件2(键 : 文本, 文件 : 文件)
		code ht.addFilePara(#键, #文件);
	结束 方法

	方法 添文件3(键 : 文本, 文件类型 : 文本, 文件名 : 文本, 内容 : 字节[])
		code ht.addFilePara(#键, #文件类型, #文件名, #内容);
	结束 方法

	方法 移除文件(键 : 文本)
		code if(ht.getFileParas() != null) ht.getFileParas().remove(#键);
	结束 方法

	方法 清空文件()
		code if(ht.getFileParas() != null) ht.getFileParas().clear();
	结束 方法

	方法 添标签(标签 : 文本)
		code ht.tag(#标签);
	结束 方法

	方法 置Range(位置 : 长整数)
		code ht.setRange(#位置);
	结束 方法

	方法 置Range2(位置 : 长整数, 结束位置 : 长整数)
		code ht.setRange(#位置, #结束位置);
	结束 方法

	方法 编码(编码 : Oks编码)
		code ht.charset(#编码);
	结束 方法

	方法 绑定(对象 : 对象)
		code ht.bind(#对象);
	结束 方法

	方法 不抛异常()
		code ht.nothrow();
	结束 方法

	方法 GET() : Oks结果
		code return new #<Oks结果>(ht.get());
	结束 方法

	方法 POST() : Oks结果
		code return new #<Oks结果>(ht.post());
	结束 方法

	方法 HEAD() : Oks结果
		code return new #<Oks结果>(ht.head());
	结束 方法

	方法 PUT() : Oks结果
		code return new #<Oks结果>(ht.put());
	结束 方法

	方法 PATCH() : Oks结果
		code return new #<Oks结果>(ht.patch());
	结束 方法

	方法 DELETE() : Oks结果
		code return new #<Oks结果>(ht.delete());
	结束 方法

	方法 CONNECT() : Oks结果
		code return new #<Oks结果>(ht.request("connect"));
	结束 方法

	方法 OPTIONS() : Oks结果
		code return new #<Oks结果>(ht.request("options"));
	结束 方法

	方法 TRACE() : Oks结果
		code return new #<Oks结果>(ht.request("trace"));
	结束 方法

	定义事件 上传进度(进度 : Oks进度)

结束 类

@导入Java("cn.zhxu.okhttps.*")
@外部依赖库("../依赖库/JSON解析库")
类 OksWS

	@code
	WHttpTask ht;
	WebSocket ws;
	android.os.Handler hr;
	boolean maint = false;
	boolean cbody = false;
	public boolean getMainT(){return maint;}
	public boolean getCB(){return cbody;}
	boolean NIO = true;
	public #<OksWS>(){
		this("null", null);
	}
	public #<OksWS>(String url){
		this(url,null);
	}
	public #<OksWS>(String url, HTTP http){
		ht = http == null ? #<OkHttps全局>.getHttp().webSocket(url) : http.webSocket(url);
		ht.setOnOpen((WebSocket ws, HttpResult res) -> {
			if(getCB()) try{res.getBody().cache().toByteStream().close();}catch(#<@异常> e){}
			if(getMainT()){
				(hr != null ? hr : (hr = new android.os.Handler(android.os.Looper.getMainLooper())))
				.post(new Runnable() {  
              	  @Override
                	public void run() {
						#连接成功(new #<Oks结果>(res));
					}
				});
				return;
			}
			if(NIO){
				android.os.Looper.prepare();
				#连接成功(new #<Oks结果>(res));
				android.os.Looper.loop();
			} else #连接成功(new #<Oks结果>(res));
        })
        .setOnMessage((WebSocket ws, WebSocket.Message msg) -> {
			if(getMainT()){
				(hr != null ? hr : (hr = new android.os.Handler(android.os.Looper.getMainLooper())))
				.post(new Runnable() {  
              	  @Override
                	public void run() {
						#收到消息(msg);
					}
				});
				return;
			}
			if(NIO){
				android.os.Looper.prepare();
				#收到消息(msg);
				android.os.Looper.loop();
			} else #收到消息(msg);
        })
        .setOnException((WebSocket ws, Throwable thr) -> {
			if(getMainT()){
				(hr != null ? hr : (hr = new android.os.Handler(android.os.Looper.getMainLooper())))
				.post(new Runnable() {  
              	  @Override
                	public void run() {
						#连接异常(thr);
					}
				});
				return;
			}
			if(NIO){
				android.os.Looper.prepare();
				#连接异常(thr);
				android.os.Looper.loop();
			} else #连接异常(thr);
        })
        .setOnClosing((WebSocket ws, WebSocket.Close close) -> {
			if(getMainT()){
				(hr != null ? hr : (hr = new android.os.Handler(android.os.Looper.getMainLooper())))
				.post(new Runnable() {  
              	  @Override
                	public void run() {
						#连接正在关闭(close);
					}
				});
				return;
			}
			if(NIO){
				android.os.Looper.prepare();
				#连接正在关闭(close);
				android.os.Looper.loop();
			} else #连接正在关闭(close);
        })
        .setOnClosed((WebSocket ws, WebSocket.Close close) -> {
			if(getMainT()){
				(hr != null ? hr : (hr = new android.os.Handler(android.os.Looper.getMainLooper())))
				.post(new Runnable() {  
              	  @Override
                	public void run() {
						#连接已关闭(close);
					}
				});
				return;
			}
			if(NIO){
				android.os.Looper.prepare();
				#连接已关闭(close);
				android.os.Looper.loop();
			} else #连接已关闭(close);
        });
	}
	@end

	方法 请求链接(ws : 文本)
		code ht.setUrl(#ws, true);
	结束 方法

	方法 添请求头(键 : 文本, 值 : 文本)
		code ht.addHeader(#键, #值);
	结束 方法

	方法 置请求头(请求头 : 文本到文本哈希表)
		清空请求头()
		code ht.addHeader(#请求头);
	结束 方法

	方法 移除请求头(键 : 文本)
		code if(ht.getHeaders() != null) ht.getHeaders().remove(#键);
	结束 方法

	方法 清空请求头()
		code if(ht.getHeaders() != null) ht.getHeaders().clear();
	结束 方法

	// URL参数，会拼接到URL ? 后面
	方法 添查询参数(键 : 文本, 值 : 文本)
		code ht.addUrlPara(#键, #值);
	结束 方法

	// URL参数，会拼接到URL ? 后面
	方法 置查询参数(请求参数 : 文本到文本哈希表)
		清空查询参数()
		code ht.addUrlPara(#请求参数);
	结束 方法

	方法 移除查询参数(键 : 文本)
		code if(ht.getUrlParas() != null) ht.getUrlParas().remove(#键);
	结束 方法

	方法 清空查询参数()
		code if(ht.getUrlParas() != null) ht.getUrlParas().clear();
	结束 方法

	// URL路径参数，替换链接里的 {name}
	方法 添路径参数(键 : 文本, 值 : 文本)
		code ht.addPathPara(#键, #值);
	结束 方法

	// URL路径参数，替换链接里的 {name}
	方法 置路径参数(路径参数 : 文本到对象哈希表)
		清空路径参数()
		code ht.addPathPara(#路径参数);
	结束 方法

	方法 移除路径参数(键 : 文本)
		code if(ht.getPathParas() != null) ht.getPathParas().remove(#键);
	结束 方法

	方法 清空路径参数()
		code if(ht.getPathParas() != null) ht.getPathParas().clear();
	结束 方法

	方法 添标签(标签 : 文本)
		code ht.tag(#标签);
	结束 方法

	方法 心跳间隔(客户端 : 整数, 服务端 : 整数)
		code ht.heatbeat(#客户端,#服务端);
	结束 方法

	方法 固定心跳(是否 : 逻辑型)
		code ht.flexiblePing(#是否);
	结束 方法

	方法 心跳内容(内容 : 文本)
		@code
		ht.pingSupplier(() ->{
			return #内容;
		});
		@end
	结束 方法

	方法 编码(编码 : Oks编码)
		code ht.charset(#编码);
	结束 方法

	方法 不抛异常()
		code ht.nothrow();
	结束 方法

	方法 绑定(对象 : 对象)
		code ht.bind(#对象);
	结束 方法

	方法 回调主线程(是否 : 逻辑型)
		code hr = new android.os.Handler(android.os.Looper.getMainLooper());
		code maint = #是否;
	结束 方法

	方法 切换IO线程(是否 : 逻辑型)
		code NIO = !#是否;
	结束 方法

	方法 缓存报文(是否 : 逻辑型)
		code cbody = #是否;
	结束 方法

	方法 启动()
		code ws = ht.listen();
	结束 方法

	方法 发送(消息 : 对象)
		code if(ws!= null) ws.send(#消息);
	结束 方法

	方法 消息类型(类型 : 文本)
		code if(ws!=null) ws.msgType(#类型);
	结束 方法

	方法 状态() : 整数
		code return ws != null ? ws.status() : -1;
	结束 方法

	方法 关闭(状态码 : 整数, 原因 : 文本)
		code ht.close(#状态码, #原因);
	结束 方法

	方法 是否已连接() : 逻辑型
		code return ht.isConnected();
	结束 方法

	方法 排队消息数量() : 长整数
		code return ws.queueSize();
	结束 方法

	方法 已关闭事件最晚触发时长(时长 : 整数)
		code ht.setMaxClosingSecs(#时长);
	结束 方法

	定义事件 连接成功(回调 : Oks结果)

	定义事件 收到消息(消息 : Oks消息)

	定义事件 连接异常(异常 : 异常)

	定义事件 连接正在关闭(原因 : OksWS关闭)

	//包含连接被取消 和 连接发生异常
	定义事件 连接已关闭(原因 : OksWS关闭)

结束 类

@禁止创建对象
@导入Java("cn.zhxu.okhttps.HttpResult")
类 Oks结果

	@code 
	public HttpResult hr;
	public #<Oks结果>(HttpResult h){
		hr = h;
	}
	@end

	方法 到文本() : 文本
		返回 报文体().到文本()
	结束 方法

	属性读 报文体() : Oks报文体
		code return new #<Oks报文体>(hr.getBody());
	结束 属性

	属性读 状态() : Oks状态
		code return hr.getState();
	结束 属性

	/*属性读 任务()
		code ht.getTask();
	结束 属性*/

	属性读 状态码() : 整数
		code return hr.getStatus();
	结束 属性

	属性读 是否成功() : 逻辑型
		code return hr.isSuccessful();
	结束 属性

	属性读 长度() : 长整数
		code return hr.getContentLength();
	结束 属性

	属性读 异常() : 异常
		code return hr.getError();
	结束 属性

	属性读 Cookie() : OksCookie集合
		code return new java.util.ArrayList<>(okhttp3.Cookie.parseAll(okhttp3.HttpUrl.parse(hr.getTask().getUrl()), hr.getHeaders()));
	结束 属性

	方法 取响应头(键 : 文本) : 文本
		code return hr.getHeader(#键);
	结束 方法

	方法 取响应头集合(键 : 文本) : 文本集合
		code return new java.util.ArrayList(hr.getHeaders(#键));
	结束 方法

	方法 取所有响应头() : 哈希表
		@code
		java.util.HashMap h = new java.util.HashMap();
		h.putAll(hr.allHeaders());
		return h;
		@end
	结束 方法

	方法 关闭报文()
		code hr.close();
	结束 方法

结束 类

@禁止创建对象
@导入Java("cn.zhxu.okhttps.HttpResult.Body")
类 Oks报文体

	@code
	public Body b;
	public #<Oks报文体>(Body by){
		b = by;
	}
	@end

	属性读 媒体类型() : Oks媒体类型
		code return b.getType();
	结束 属性

	属性读 长度() : 长整数
		code return b.getLength();
	结束 属性

	方法 切换IO线程()
		code b.nextOnIO();
	结束 方法

	方法 进度事件步进字节(步进字节 : 长整数)
		code b.stepRate(#步进字节);
	结束 方法

	方法 进度事件步进比例(比例 : 小数)
		code b.stepRate(#比例);
	结束 方法

	code android.os.Handler hr;

	方法 开启进度回调(是否 : 逻辑型)
		@code
		if(#是否) b.setOnProcess((#<@Oks进度> s) -> {
			(hr != null ? hr : (hr = new android.os.Handler(android.os.Looper.getMainLooper())))
			.post(new Runnable() {  
                 @Override
                public void run() {
					#接收进度(s);
				}
			});
		});
		else b.setOnProcess(null);
		@end
	结束 方法

	方法 忽略Range信息()
		code b.setRangeIgnored();
	结束 方法

	方法 缓存()
		@code
		try{
			b.cache();
		} catch (android.os.NetworkOnMainThreadException e){throw new RuntimeException("OkHttps：不可在主线程中进行缓存。");}
		catch (java.lang.IllegalStateException e){
			throw new RuntimeException("OkHttps：不可在已设置 开启进度回调/接收进度事件 的情况下缓存。");
		}
		@end
	结束 方法

	方法 到文本() : 文本
		code return b.toString();
	结束 方法

	方法 到字节组() : 字节[]
		code return b.toBytes();
	结束 方法

	方法 到字节流() : 输入流
		code return b.toByteStream();
	结束 方法

	方法 到文件(保存路径 : 文本) : Oks下载控制器
		code return new #<Oks下载控制器>(b.toFile(#保存路径));
	结束 方法

	方法 到文件2(文件 : 文件) : Oks下载控制器
		code return new #<Oks下载控制器>(b.toFile(#文件));
	结束 方法

	方法 到文件夹(保存路径 : 文本) : Oks下载控制器
		code return new #<Oks下载控制器>(b.toFolder(#保存路径));
	结束 方法

	方法 到文件夹2(文件夹 : 文件) : Oks下载控制器
		code return new #<Oks下载控制器>(b.toFolder(#文件夹));
	结束 方法

	方法 关闭报文()
		code b.close();
	结束 方法

	@属性需求.开启进度回调(真)
	定义事件 接收进度(进度 : Oks进度)

结束 类

@禁止创建对象
@指代类("cn.zhxu.okhttps.Process")
类 Oks进度

	属性读 完成比例() : 小数
		@code
		#<@小数> i = #this.getRate();
		return i > 0 ? i : i * -1;
		@end
	结束 属性

	属性读 总字节数() : 长整数
		code return #this.getTotalBytes();
	结束 属性

	属性读 完成字节数() : 长整数
		code return #this.getTotalBytes();
	结束 属性

	属性读 是否完成() : 逻辑型
		code return #this.isDone();
	结束 属性

结束 类

@禁止创建对象
@指代类("okhttp3.MediaType")
类 Oks媒体类型

	属性读 类型() : 文本
		code return #this.type();
	结束 属性

	属性读 子类型() : 文本
		code return #this.subtype();
	结束 属性

	属性读 到文本() : 文本
		code return #this.toString();
	结束 属性

结束 类

@禁止创建对象
@指代类("cn.zhxu.okhttps.HttpResult.State")
类 Oks状态

	@静态
	属性读 异常() : Oks状态
		code return #<@Oks状态>.EXCEPTION;
	结束 属性

	@静态
	属性读 被取消() : Oks状态
		code return #<@Oks状态>.CANCELED;
	结束 属性

	@静态
	属性读 已响应() : Oks状态
		code return #<@Oks状态>.RESPONSED;
	结束 属性

	@静态
	属性读 网络超时() : Oks状态
		code return #<@Oks状态>.TIMEOUT;
	结束 属性

	@静态
	属性读 网络出错() : Oks状态
		code return #<@Oks状态>.NETWORK_ERROR;
	结束 属性

结束 类

@禁止创建对象
@指代类("cn.zhxu.okhttps.WebSocket.Message")
类 Oks消息

	方法 是否为文本() : 逻辑型
		code return #this.isText();
	结束 方法

	方法 到文本() : 文本
		code return #this.toString();
	结束 方法

	方法 到字节组() : 字节[]
		code return #this.toBytes();
	结束 方法

	方法 到字节流() : 输入流
		code return #this.toByteStream();
	结束 方法

结束 类

@禁止创建对象
@指代类("cn.zhxu.okhttps.WebSocket.Close")
类 OksWS关闭

	方法 状态码() : 整数
		code return #this.getCode();
	结束 方法

	方法 关闭原因() : 文本
		code return #this.getReason();
	结束 方法

	方法 是否取消() : 逻辑型
		code return #this.isCanceled();
	结束 方法

	方法 是否异常() : 逻辑型
		code return #this.isException();
	结束 方法

	方法 是否网络错误() : 逻辑型
		code return #this.isNetworkError();
	结束 方法

	方法 是否网络超时() : 逻辑型
		code return #this.isTimeout();
	结束 方法

	方法 到文本() : 文本
		code return #this.toString();
	结束 方法

结束 类

@禁止创建对象
@指代类("java.nio.charset.Charset")
@导入Java("java.nio.charset.StandardCharsets")
类 Oks编码

	@静态
	属性读 UTF_8() : Oks编码
		code return StandardCharsets.UTF_8;
	结束 属性

	@静态
	属性读 UTF_16() : Oks编码
		code return StandardCharsets.UTF_16;
	结束 属性

	@静态
	属性读 UTF_16BE() : Oks编码
		code return StandardCharsets.UTF_16BE;
	结束 属性

	@静态
	属性读 UTF_16LE() : Oks编码
		code return StandardCharsets.UTF_16LE;
	结束 属性

	@静态
	属性读 ISO_8859_1() : Oks编码
		code return StandardCharsets.ISO_8859_1;
	结束 属性

	@静态
	属性读 US_ASCII() : Oks编码
		code return StandardCharsets.US_ASCII;
	结束 属性

	@静态
	属性读 GBK() : Oks编码
		code return #<@Oks编码>.forName("GBK");
	结束 属性

结束 类

@禁止创建对象
@附加权限(安卓权限.文件权限_写入)
@导入Java("cn.zhxu.okhttps.Download")
类 Oks下载控制器
	@code
	Download dl;
	android.os.Handler hr;
	public #<Oks下载控制器>(Download d){
		dl = d;
		dl.setOnSuccess((#<@文件> f) -> {
			(hr != null ? hr : (hr = new android.os.Handler(android.os.Looper.getMainLooper())))
			.post(new Runnable() {  
                 @Override
                public void run() {
					#下载完成(f);
				}
			});
		})
		.setOnFailure((Download.Failure f) -> {
			(hr != null ? hr : (hr = new android.os.Handler(android.os.Looper.getMainLooper())))
			.post(new Runnable() {  
                 @Override
                public void run() {
					#下载错误(f.getFile(), f.getDoneBytes(), f.getException());
				}
			});
		})
		.setOnComplete((Download.Status s) -> {
			(hr != null ? hr : (hr = new android.os.Handler(android.os.Looper.getMainLooper())))
			.post(new Runnable() {  
                 @Override
                public void run() {
					#下载结束(s);
				}
			});
		});
	}
	@end

	方法 缓存区大小(字节 : 整数)
		code dl.setBuffSize(#字节);
	结束 方法

	方法 追加位置(跳过字节 : 长整数)
		@code
		dl.setAppended();
		dl.setFilePointer(#跳过字节);
		@end
	结束 方法

	方法 切换IO线程()
		code dl.nextOnIO();
	结束 方法

	方法 开始下载()
		code dl.start();
	结束 方法

	方法 暂停下载()
		code dl.getCtrl().pause();
	结束 方法

	方法 继续下载()
		code dl.getCtrl().resume();
	结束 方法

	方法 取消下载()
		code dl.getCtrl().cancel();
	结束 方法

	定义事件 下载完成(文件 : 文件)

	定义事件 下载错误(文件 : 文件, 已下载 : 长整数, 异常 : 异常)

	定义事件 下载结束(状态 : Oks下载状态)

结束 类

@禁止创建对象
@指代类("cn.zhxu.okhttps.Download.Status")
类 Oks下载状态

	@静态
	属性读 取消() : Oks下载状态
		code return #<@Oks下载状态>.CANCELED;
	结束 属性

	@静态
	属性读 下载中() : Oks下载状态
		code return #<@Oks下载状态>.DOWNLOADING;
	结束 属性

	@静态
	属性读 暂停() : Oks下载状态
		code return #<@Oks下载状态>.PAUSED;
	结束 属性

	@静态
	属性读 成功() : Oks下载状态
		code return #<@Oks下载状态>.DONE;
	结束 属性

	@静态
	属性读 异常() : Oks下载状态
		code return #<@Oks下载状态>.ERROR;
	结束 属性

结束 类

@导入Java("okhttp3.Cookie.Builder")
类 OksCookie构建

	@code
	Builder br;
	public #<OksCookie构建>(){}
	public #<OksCookie构建>(Builder b){
		br = b;
	}
	@end

	方法 名称(名 : 文本) : OksCookie构建
		code br.name(#名);
		返回 本对象
	结束 方法

	方法 值(值 : 文本) : OksCookie构建
		code br.value(#值);
		返回 本对象
	结束 方法

	方法 有效期(时长 : 长整数) : OksCookie构建
		code br.expiresAt(#时长);
		返回 本对象
	结束 方法

	方法 域名(域名 : 文本, 为主域名 : 逻辑型 = 假) : OksCookie构建
		code if(#为主域名) br.hostOnlyDomain(#域名); else br.domain(#域名);
		返回 本对象
	结束 方法

	方法 路径(路径 : 文本) : OksCookie构建
		code br.path(#路径);
		返回 本对象
	结束 方法

	方法 安全的() : OksCookie构建
		code br.secure();
		返回 本对象
	结束 方法

	方法 创建Cookie() : OksCookie
		code return br.build();
	结束 方法

结束 类

@禁止创建对象
@指代类("okhttp3.Cookie")
类 OksCookie

	@静态
	@运算符重载
	方法 =(链接 : 文本, Cookie文本 : 文本) : OksCookie
		返回 解析(链接,Cookie文本)
	结束 方法

	@静态
	方法 构建(链接 : 文本, Cookie文本 : 文本) : OksCookie
		返回 解析(链接,Cookie文本)
	结束 方法

	@静态
	方法 解析(链接 : 文本, Cookie文本 : 文本) : OksCookie
		code return #<@OksCookie>.parse(okhttp3.HttpUrl.parse(#链接), #Cookie文本);
	结束 方法

	属性读 名称() : 文本
		code return #this.name();
	结束 属性

	属性读 值() : 文本
		code return #this.value();
	结束 属性

	属性读 域名() : 文本
		code return #this.domain();
	结束 属性

	属性读 是否持久() : 逻辑型
		code return #this.persistent();
	结束 属性

	属性读 有效期() : 长整数
		code return #this.expiresAt();
	结束 属性

	属性读 是否有效() : 逻辑型
		code return !#是否过期(#this);
	结束 属性

	属性读 为主域名() : 逻辑型
		code return #this.hostOnly();
	结束 属性

	属性读 仅HTTP() : 逻辑型
		code return #this.httpOnly();
	结束 属性

	属性读 安全的() : 逻辑型
		code return #this.secure();
	结束 属性

	方法 是否同域(链接 : 文本) : 逻辑型
		code return #this.matches(okhttp3.HttpUrl.parse(#链接));
	结束 方法

	@静态
	方法 是否过期(Cookie : OksCookie) : 逻辑型
		code return #Cookie.expiresAt() > System.currentTimeMillis();
	结束 方法

	方法 到文本() : 文本
		code return #this.toString();
	结束 方法

结束 类

类 OksCookie集合 : 集合模板类<OksCookie>

	方法 到文本() : 文本
		变量 Cookie : 文本
		循环(i, 0, 长度())
			变量 c : OksCookie = 取成员(i)
			Cookie = Cookie + c.名称() + "=" + c.值()
			如果 i != 0 || i != 长度() - 1
				Cookie = Cookie + ";"
			结束 如果
		结束 循环
		返回 Cookie
	结束 方法

结束 类

@禁止创建对象
@指代类("com.lzy.okgo.cookie.store.CookieStore")
类 OksCookie管理器

	方法 保存Cookie(链接 : 文本, Cookie : OksCookie)
		code #this.saveCookie(okhttp3.HttpUrl.parse(#链接), #Cookie);
	结束 方法

	方法 保存Cookie集(链接 : 文本, Cookie : OksCookie集合)
		code #this.saveCookie(okhttp3.HttpUrl.parse(#链接), (java.util.List)#Cookie);
	结束 方法

	方法 加载Cookie(链接 : 文本) : OksCookie集合
		code return new java.util.ArrayList<>(#this.loadCookie(okhttp3.HttpUrl.parse(#链接)));
	结束 方法

	方法 取Cookie(链接 : 文本) : OksCookie集合
		code return new java.util.ArrayList<>(#this.getCookie(okhttp3.HttpUrl.parse(#链接)));
	结束 方法

	方法 取所有Cookie() : OksCookie集合
		code return new java.util.ArrayList<>(#this.getAllCookie());
	结束 方法

	方法 移除Cookie(链接 : 文本) : 逻辑型
		code return #this.removeCookie(okhttp3.HttpUrl.parse(#链接));
	结束 方法

	方法 移除指定Cookie(链接 : 文本, Cookie : OksCookie) : 逻辑型
		code return #this.removeCookie(okhttp3.HttpUrl.parse(#链接), #Cookie);
	结束 方法

	方法 移除所有Cookie() : 逻辑型
		code return #this.removeAllCookie();
	结束 方法

结束 类

类 网络工具_Oks

	@隐藏
	变量 ok : Oks异步

	@隐藏
	变量 dn : Oks下载控制器?

	@隐藏
	变量 请求计时 : 倒计时器

	@隐藏
	方法 计超时(时长 : 长整数)
		取消计时()
		请求计时 = 创建 倒计时器
		事件 请求计时:倒计时结束()
			取消计时()
			取消下载()
			容错运行(ok.取消请求())
			请求超时(时长)
		结束 事件
		请求计时.开始倒计时(时长, 1000)
	结束 方法

	@隐藏
	方法 取消计时()
		如果 请求计时 != 空
			容错运行(请求计时.关闭())
			请求计时 = 空
		结束 如果
	结束 方法

	// 取OkHttps 对象 自定义
	方法 取OkHttp() : Oks异步
		返回 ok
	结束 方法

	/*
	添加请求头，在进行请求时会附加上
	*/
	方法 添加请求头(名称 : 文本, 值 : 文本)
		ok.添请求头(名称,值)
	结束 方法

	/*
	移除指定名称所对应的请求头
	*/
	方法 移除请求头(名称 : 文本)
		ok.移除请求头(名称)
	结束 方法

	/*
	清除所有请求头
	方法 清除请求头()
==	结束 方法

	/*
	异步获取网页源码
	参数一为网址
	参数二为请求时要附加的cookie，不填写默认为空
	参数三为访问超时时间，不填写默认6000ms
	参数四为编码，不填写默认UTF-8
	*/
	方法 取网页源码(
		网址 : 文本,
		cookie : 文本 = 空,
		超时 : 整数 = 6000,
		编码 : Oks编码 = Oks编码.UTF_8)
		ok.请求链接(网址)
		如果 cookie != 空
			ok.添请求头("cookie",cookie)
		结束 如果
		ok.编码(编码)
		ok.不抛异常()
		ok.回调主线程(真)
		ok.缓存报文(真)
		事件 ok:请求成功(结果 : Oks结果)
			取网页源码结束(结果.到文本(), 结果.报文体.到字节组(), 结果.Cookie.到文本())
		结束 事件
		事件 ok:请求异常(异常信息 : 异常)
			取网页源码失败()
		结束 事件
		事件 ok:请求完成(状态 : Oks状态)
			取消计时()
		结束 事件
		ok.置请求参数(空)
		ok.GET()
		计超时(超时)
	结束 方法

	/*
	同步获取网页源码
	参数一为网址
	参数二为请求时要附加的cookie，不填写默认为空
	参数三为访问超时时间，不填写默认6000ms
	参数四为编码，不填写默认UTF-8
	*/
	方法 取网页源码_同步(
		网址 : 文本,
		cookie : 文本 = 空,
		超时 : 整数 = 6000,
		编码 : Oks编码 = Oks编码.UTF_8) : 文本
		ok.请求链接(网址)
		如果 cookie != 空
			ok.添请求头("cookie",cookie)
		结束 如果
		ok.不抛异常()
		ok.编码(编码)
		ok.GET()
		计超时(超时)
		变量 w = ok.取结果().到文本()
		取消计时()
		返回 w
	结束 方法

	/*
	同步获取网页源码字节集
	参数一为网址
	参数二为请求时要附加的cookie，不填写默认为空
	参数三为访问超时时间，不填写默认6000ms
	参数四为编码，不填写默认UTF-8
	*/
	方法 取网页源码_字节集_同步(
		网址 : 文本,
		cookie : 文本 = 空,
		超时 : 整数 = 6000,
		编码 : Oks编码 = Oks编码.UTF_8) : 字节[]
		ok.请求链接(网址)
		如果 cookie != 空
			ok.添请求头("cookie",cookie)
		结束 如果
		ok.编码(编码)
		ok.不抛异常()
		ok.GET()
		计超时(超时)
		变量 w = ok.取结果().报文体.到字节组()
		取消计时()
		返回 w
	结束 方法

	/*
	异步发送数据
	参数一为网址
	参数二为欲发送的数据，可以为文本，也可以为字节集或者文件
	参数三为请求时要附加的cookie，不填写默认为空
	参数四为访问超时时间，不填写默认6000ms
	参数五为编码，不填写默认UTF-8
	*/
	方法 发送数据(
		网址 : 文本,
		欲发送数据 : 对象,
		cookie : 文本 = 空,
		超时 : 整数 = 6000,
		编码 : Oks编码 = Oks编码.UTF_8)
		ok.取消请求()
		ok.请求链接(网址)
		如果 cookie != 空
			ok.添请求头("cookie",cookie)
		结束 如果
		如果 ok.取请求类型() == "form"
			如果 (欲发送数据 属于 文本) && 欲发送数据.到文本().删首尾空().开头为("{")
				ok.请求类型("json")
			否则 欲发送数据 属于 JSON对象
				欲发送数据 = 欲发送数据.到文本()
				ok.请求类型("json")
			结束 如果
		结束 如果
		ok.置请求参数(欲发送数据)
		ok.编码(编码)
		事件 ok:请求成功(结果 : Oks结果)
			结果.报文体.缓存()
			发送数据结束(结果.到文本(), 结果.报文体.到字节组(), 结果.Cookie.到文本())
		结束 事件
		事件 ok:请求异常(异常信息 : 异常)
			发送数据失败()
		结束 事件
		事件 ok:请求完成(状态 : Oks状态)
			取消计时()
		结束 事件
		ok.缓存报文(真)
		ok.回调主线程(真)
		ok.不抛异常()
		ok.POST()
		计超时(超时)
	结束 方法

	/*
	同步发送数据
	参数一为网址
	参数二为欲发送的数据，可以为文本，也可以为字节集或者文件
	参数三为请求时要附加的cookie，不填写默认为空
	参数四为访问超时时间，不填写默认6000ms
	参数五为编码，不填写默认UTF-8
	*/
	方法 发送数据_同步(
		网址 : 文本,
		欲发送数据 : 对象,
		cookie : 文本 = 空,
		超时 : 整数 = 6000,
		编码 : Oks编码 = Oks编码.UTF_8) : 文本
		ok.请求链接(网址)
		如果 cookie != 空
			ok.添请求头("cookie",cookie)
		结束 如果
		如果 ok.取请求类型() == "form"
			如果 (欲发送数据 属于 文本) && 欲发送数据.到文本().删首尾空().开头为("{")
				ok.请求类型("json")
			否则 欲发送数据 属于 JSON对象
				欲发送数据 = 欲发送数据.到文本()
				ok.请求类型("json")
			结束 如果
		结束 如果
		ok.置请求参数(欲发送数据)
		ok.不抛异常()
		ok.编码(编码)
		ok.POST()
		计超时(超时)
		变量 w = ok.取结果().到文本()
		取消计时()
		返回 w
	结束 方法

	/*
	同步发送数据，并要求返回字节集
	参数一为网址
	参数二为欲发送的数据，可以为文本，也可以为字节集或者文件
	参数三为请求时要附加的cookie，不填写默认为空
	参数四为访问超时时间，不填写默认6000ms
	参数五为编码，不填写默认UTF-8
	*/
	方法 发送数据_字节集_同步(
		网址 : 文本,
		欲发送数据 : 对象,
		cookie : 文本 = 空,
		超时 : 整数 = 6000,
		编码 : Oks编码 = Oks编码.UTF_8) : 字节[]
		ok.请求链接(网址)
		如果 cookie != 空
			ok.添请求头("cookie",cookie)
		结束 如果
		如果 ok.取请求类型() == "form"
			如果 (欲发送数据 属于 文本) && 欲发送数据.到文本().删首尾空().开头为("{")
				ok.请求类型("json")
			否则 欲发送数据 属于 JSON对象
				欲发送数据 = 欲发送数据.到文本()
				ok.请求类型("json")
			结束 如果
		结束 如果
		ok.置请求参数(欲发送数据)
		ok.编码(编码)
		ok.不抛异常()
		ok.POST()
		计超时(超时)
		变量 w = ok.取结果().报文体.到字节组()
		取消计时()
		返回 w
	结束 方法

	/*
	下载文件
	参数一为网址
	参数二为文件下载保存路径
	参数三为请求时要附加的cookie，不填写默认为空
	参数四为访问超时时间，不填写默认6000ms
	参数五为编码，不填写默认UTF-8
	最后返回是否下载成功
	*/
	@附加权限(安卓权限.文件权限_写入)
	方法 下载(
		网址 : 文本,
		保存路径 : 文本,
		cookie : 文本 = 空,
		超时 : 整数 = 60000,
		编码 : Oks编码 = Oks编码.UTF_8)
		ok.请求链接(网址)
		如果 cookie != 空
			ok.添请求头("cookie",cookie)
		结束 如果
		ok.编码(编码)
		ok.不抛异常()
		ok.回调主线程(假)
		ok.缓存报文(假)
		事件 ok:请求成功(结果 : Oks结果)
			变量 报文 : Oks报文体 = 结果.报文体
			事件 报文:接收进度(进度 : Oks进度)
				正在下载(进度.完成比例 * 100d)
			结束 事件
			容错处理()
			dn = 报文.到文件(保存路径)
			俘获所有异常()
			如果 取俘获异常().取造成原因().取异常信息() == "Operation not permitted"
				运行报错("文件创建失败，请确认路径是否正确 以及权限是否授权")
			结束 如果
			结束俘获异常()
			事件 dn:下载完成(文件 : 文件)
				变量 cj : OksCookie集合 = 结果.Cookie
				变量 c : 文本
				code #c = #cj.toString();
				如果 c.长度 > 3
					c = c.取文本中间(1, c.长度 - 2)
				结束 如果
				下载结束(c)
			结束 事件
			事件 dn:下载错误(文件 : 文件,已下载 : 长整数,异常 : 异常)
				下载失败()
			结束 事件
			事件 dn:下载结束(状态 : Oks下载状态)
				取消计时()
				dn = 空
			结束 事件
			dn.开始下载()
		结束 事件
		事件 ok:请求完成(状态 : Oks状态)
		结束 事件
		ok.GET()
		计超时(超时)
	结束 方法

	//取消下载并删除文件
	方法 取消下载()
		如果 dn != 空
			容错运行(dn.取消下载())
		结束 如果
	结束 方法

	/*
	同步下载文件
	参数一为网址
	参数二为文件下载保存路径
	参数三为请求时要附加的cookie，不填写默认为空
	参数四为访问超时时间，不填写默认6000ms
	参数五为编码，不填写默认UTF-8
	最后返回是否下载成功
	*/
	@附加权限(安卓权限.文件权限_写入)
	方法 下载_同步(
		网址 : 文本,
		保存路径 : 文本,
		cookie : 文本 = 空,
		超时 : 整数 = 60000,
		编码 : Oks编码 = Oks编码.UTF_8) : 文件
		ok.请求链接(网址)
		如果 cookie != 空
			ok.添请求头("cookie",cookie)
		结束 如果
		ok.编码(编码)
		ok.不抛异常()
		ok.GET()
		计超时(超时)
		变量 b = ok.取结果().报文体
		b.缓存()
		b.到文件(保存路径)
		取消计时()
		变量 w : 文件 = 保存路径
		返回 w
	结束 方法

	/*
	上传文件
	参数一为网址
	参数二为文件路径
	参数三为服务端所要求的键名，不填写默认为file
	参数四为请求时要附加的cookie，不填写默认为空
	参数五为访问超时时间，不填写默认6000ms
	参数六为编码，不填写默认UTF-8
	最后返回响应结果
	*/
	方法 上传(
		网址 : 文本,
		文件路径 : 文本,
		键名 : 文本 = "file",
		cookie : 文本 = 空,
		超时 : 整数 = 60000,
		编码 : Oks编码 = Oks编码.UTF_8)
		ok.请求链接(网址)
		ok.编码(编码)
		ok.回调主线程(真)
		ok.不抛异常()
		ok.缓存报文(真)
		ok.清空文件()
		ok.添文件(键名,文件路径)
		如果 cookie != 空
			ok.添请求头("cookie",cookie)
		结束 如果
		事件 ok:上传进度(进度 : Oks进度)
			正在上传(进度.完成比例 * 100d)
		结束 事件
		事件 ok:请求成功(结果 : Oks结果)
			上传结束(结果.到文本(), 结果.报文体.到字节组(), 结果.Cookie.到文本())
		结束 事件
		事件 ok:请求异常(异常信息 : 异常)
			上传失败()
		结束 事件
		事件 ok:请求完成(状态 : Oks状态)
			取消计时()
		结束 事件
		计超时(超时)
		ok.POST()
	结束 方法

	方法 取消上传()
		ok.取消请求()
	结束 方法

	/*
	参数一为网址
	参数二为文件路径
	参数三为服务端所要求的键名，不填写默认为file
	参数四为请求时要附加的cookie，不填写默认为空
	参数五为访问超时时间，不填写默认6000ms
	参数六为编码，不填写默认UTF-8
	最后返回是否上传成功
	*/
	方法 上传_同步(
		网址 : 文本,
		文件路径 : 文本,
		键名 : 文本 = "file",
		cookie : 文本 = 空,
		超时 : 整数 = 60000,
		编码 : Oks编码 = Oks编码.UTF_8) : 文本
		ok.请求链接(网址)
		ok.编码(编码)
		ok.清空文件()
		ok.添文件(键名,文件路径)
		ok.不抛异常()
		如果 cookie != 空
			ok.添请求头("cookie",cookie)
		结束 如果
		计超时(超时)
		ok.POST()
		变量 w = ok.取结果().到文本()
		取消计时()
		返回 w
	结束 方法


	定义事件 请求超时(时长 : 长整数)

	/*
	当取网页源码(Get)结束时触发该事件
	并返回取源结果和cookie
	*/
	定义事件 取网页源码结束(结果 为 文本, 内容 : 字节[], cookie 为 文本)

	/*
	当取网页源码(Get)失败时触发该事件
	*/
	定义事件 取网页源码失败()

	/*
	当发送数据(Post)结束时触发该事件
	并返回取源结果和cookie
	*/
	定义事件 发送数据结束(结果 为 文本, 内容 : 字节[], cookie 为 文本)

	/*
	当发送数据(Post)失败时触发该事件
	*/
	定义事件 发送数据失败()

	/*
	当正在下载文件进度改变时触发该事件
	*/
	定义事件 正在下载(进度 : 小数)

	/*
	当下载文件结束时触发该事件
	并返回cookie
	*/
	定义事件 下载结束(cookie : 文本)

	/*
	当下载(Download)失败时触发该事件
	*/
	定义事件 下载失败()

	/*
	当正在上传文件进度改变时触发该事件
	*/
	定义事件 正在上传(进度 : 小数)

	/*
	当上传文件结束时触发该事件
	并返回cookie
	*/
	定义事件 上传结束(结果 : 文本, 内容 : 字节[], cookie : 文本)

	/*
	当上传(Upload)失败时触发该事件
	*/
	定义事件 上传失败()

结束 类